package org.cybzacg.encryption.enums;

/**
 * 加密类型枚举
 * 定义支持的加密类型
 * 
 * @author encryption team
 * @version 1.0
 */
public enum EncryptionType {
    
    /**
     * 对称加密
     */
    SYMMETRIC("对称加密", "使用相同密钥进行加密和解密"),
    
    /**
     * 非对称加密
     */
    ASYMMETRIC("非对称加密", "使用公钥加密，私钥解密"),
    
    /**
     * 哈希加密
     */
    HASH("哈希加密", "单向加密，不可逆"),
    
    /**
     * 混合加密
     */
    HYBRID("混合加密", "结合对称和非对称加密的优势"),
    
    /**
     * 流加密
     */
    STREAM("流加密", "逐字节或逐位进行加密"),
    
    /**
     * 块加密
     */
    BLOCK("块加密", "按固定大小的数据块进行加密");
    
    private final String displayName;
    private final String description;
    
    EncryptionType(String displayName, String description) {
        this.displayName = displayName;
        this.description = description;
    }
    
    /**
     * 获取显示名称
     * 
     * @return 显示名称
     */
    public String getDisplayName() {
        return displayName;
    }
    
    /**
     * 获取描述
     * 
     * @return 描述
     */
    public String getDescription() {
        return description;
    }
    
    /**
     * 检查是否为对称加密
     * 
     * @return 是否为对称加密
     */
    public boolean isSymmetric() {
        return this == SYMMETRIC;
    }
    
    /**
     * 检查是否为非对称加密
     * 
     * @return 是否为非对称加密
     */
    public boolean isAsymmetric() {
        return this == ASYMMETRIC;
    }
    
    /**
     * 检查是否为哈希加密
     * 
     * @return 是否为哈希加密
     */
    public boolean isHash() {
        return this == HASH;
    }
    
    /**
     * 检查是否为混合加密
     * 
     * @return 是否为混合加密
     */
    public boolean isHybrid() {
        return this == HYBRID;
    }
    
    /**
     * 检查是否需要密钥对
     * 
     * @return 是否需要密钥对
     */
    public boolean requiresKeyPair() {
        return this == ASYMMETRIC || this == HYBRID;
    }
    
    /**
     * 检查是否支持双向加密
     * 
     * @return 是否支持双向加密
     */
    public boolean supportsBidirectional() {
        return this != HASH;
    }
    
    /**
     * 根据名称查找加密类型
     * 
     * @param name 名称
     * @return 加密类型，如果未找到返回null
     */
    public static EncryptionType fromName(String name) {
        if (name == null) {
            return null;
        }
        
        try {
            return EncryptionType.valueOf(name.toUpperCase());
        } catch (IllegalArgumentException e) {
            return null;
        }
    }
    
    /**
     * 根据显示名称查找加密类型
     * 
     * @param displayName 显示名称
     * @return 加密类型，如果未找到返回null
     */
    public static EncryptionType fromDisplayName(String displayName) {
        if (displayName == null) {
            return null;
        }
        
        for (EncryptionType type : values()) {
            if (type.getDisplayName().equals(displayName)) {
                return type;
            }
        }
        return null;
    }
    
    @Override
    public String toString() {
        return displayName + " (" + description + ")";
    }
}
